package com.utils;

import javax.crypto.*;
import javax.crypto.spec.SecretKeySpec;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;

public class AESUtil {

    public static SecretKey generateKey() throws NoSuchAlgorithmException {
        KeyGenerator keyGenerator=KeyGenerator.getInstance("AES");
        keyGenerator.init(128);//使用128位的AES密匙
        return keyGenerator.generateKey();
    }

    public static String encrypt(String data,String key) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException {
        Cipher cipher=Cipher.getInstance("AES");
        //创建了一个Cipher对象，并指定使用的加密算法是AES（Advanced Encryption Standard，先进加密标准）
        SecretKeySpec secretKeySpec=new SecretKeySpec(key.getBytes(),"AES");
        //使用传入的key字符串来创建一个SecretKeySpec对象，这个对象指定了AES加密所需的密钥。
        cipher.init(Cipher.ENCRYPT_MODE,secretKeySpec);
        //初始化了Cipher对象，使其处于加密模式（Cipher.ENCRYPT_MODE），并指定了密钥secretKeySpec。
        byte[] encryptedData = cipher.doFinal(data.getBytes());
        //实际的加密操作。它将输入的data字符串（转换为字节数组）进行AES加密，返回加密后的字节数组encryptedData。
        return Base64.getEncoder().encodeToString(encryptedData);
        //加密后的字节数组转换为Base64编码的字符串，并返回这个字符串。Base64编码是为了让加密后的数据能够以可读的文本格式存储或传输。
    }

    public static String decrypt(String data,String key) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException {
        Cipher cipher=Cipher.getInstance("AES");
        SecretKeySpec secretKeySpec=new SecretKeySpec(key.getBytes(),"AES");
        cipher.init(Cipher.DECRYPT_MODE,secretKeySpec);
        byte [] decodedData=Base64.getDecoder().decode(data.getBytes());
        byte [] decryptedData=cipher.doFinal(decodedData);
        String decryptedStr=new String(decryptedData);
        return decryptedStr;
    }
}
